import Storage from 'react-native-storage';
import AsyncStorage from '@react-native-async-storage/async-storage';

const defaultExpires = null;
const size = 1000;
const storage = new Storage({
  size, // 数据上限
  storageBackend: AsyncStorage,
  defaultExpires, // 过期时间
  enableCache: true, // 是否缓存
  sync: null, // 同步方法
});

global.storage = storage;

export default class StorageManager {
  /**
   * 存储
   *
   * @param  key 读取key值对应的数据 必传 唯一标识
   * @param  data 存储的数据 type: string || object
   * @param  id   非必传 标识
   */
  static save(key, data, id) {
    // let value = JSON.stringify(data)
    if (id) {
      storage.save({
        key,
        id,
        data,
        expires: defaultExpires,
      });
    } else {
      storage.save({
        key,
        data,
        expires: defaultExpires,
      });
    }
  }

  /**
   * 根据key或者key-id得到存储的数据
   *
   * @param key 必传
   * @param id  可不传
   */
  static async load(key, id) {
    let ret;
    if (id) {
      try {
        ret = await storage.load({
          key,
          id,
          autoSync: false,
          syncInBackground: false,
        });
      } catch (err) {
        console.log(err.message);
        ret = null;
      }
    } else {
      try {
        // JSON.parse(ret)
        ret = await storage.load({
          key,
          autoSync: false,
          syncInBackground: false,
        });
      } catch (err) {
        // console.log(err);
        ret = null;
      }
    }
    return ret;
  }

  // 获取key下的所有数据(仅key-id数据)
  static async loadAllDataForKey(key) {
    let ret;
    try {
      ret = await storage.getAllDataForKey(key);
    } catch (err) {
      console.log(err.message);
      ret = null;
    }
    return ret;
  }

  // 获取key下的所有id(仅key-id数据)
  static async loadIdsForKey(key) {
    let ids;
    try {
      ids = await storage.getIdsForKey(key);
    } catch (err) {
      console.log(err.message);
      ids = null;
    }
    return ids;
  }

  /**
   * 删除单个数据
   * @param key 删除key所对应的数据,必传
   * @param id  删除id对应的数据，若删除的数据中有id,则必传
   */
  static remove(key, id) {
    if (id) {
      return storage.remove({
        key,
        id,
      });
    }
    return storage.remove({
      key,
    });
  }

  // 清空某个key下的所有数据(仅key-id数据)
  static clearMapForkey(key) {
    storage.clearMapForKey(key);
  }

  // 清空所有map,移除所有key-id数据（但会保留只有key的数据）
  static clearMaps() {
    storage.clearMap();
  }
}

export const USER_INFO = 'userInfo';
/**
 * 钱包列表，存储结果为
 * {heco:[address]}
 */
export const WALLET_LIST = 'walletList';

/**
 * 存储的钱包类型
 */
export const walletType = {
  HECO: 'heco',
};

/**
 * 网络类型
 */
export const CHAIN_TYPE = 'chainType';

/**
 * 是否第一次安装
 */
export const IS_FIRST_INSTALL = 'firstInstall';

/**
 * 选择的国家区号
 */
export const SELECTED_PHONE_AREA = 'selectedPhoneArea';

/**
 * metamask 地址
 */
export const METAMASK_ADDRESS = 'metamaskAddress';

/**
 * 浏览器历史记录 地址
 */
export const BROWSER_HISTORY = 'browserHistory';

/**
 * 本地下载的游戏信息，数组格式，包括[name,version,unzipVersion]
 * @return {[name,version,unzipVersion]}
 */
export const GAME_LIST = 'gameList';

/**
 * web页面，菜单按钮离底部距离
 */
export const WEB_MENU_BOTTOM = 'webMenuBottomValue';

/**
 * 房间页面引导提示
 */
export const DID_SHOW_ROOM_LEAD = 'didShowRoomLead';
